package com.bjpowernode.javase.collection;
/*
1、JDK5.0之后推出的新特新：泛型
2、泛型这种语法机制，只在程序编译阶段起作用，只是给编译器参考的，运行阶段泛型没用。
3、使用泛型的好处：
    1、集合中存储的元素类型统一了。
    2、从集合中取出的元素时泛型指定的类型，不需要大量的使用“向下转型”。
4、泛型的缺点是什么？
    导致集合中存储的元素缺乏多样性。
    大多数业务中集合中存储的元素都是统一的。
 */
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class GenericTest01 {
    public static void main(String[] args) {
        /*//不使用泛型机制，分析程序存在哪些缺点。
        List myList = new ArrayList();
        Cat c = new Cat();
        Bird b = new Bird();

        myList.add(c);
        myList.add(b);

        //遍历集合去除cat抓老鼠，去除bird让他飞
        for(int i = 0;i < myList.size();i++){
            if(myList.get(i) instanceof Cat){
                Cat cat = (Cat)myList.get(i);
                cat.catchMouse();
            }else if(myList.get(i) instanceof Bird){
                Bird bird = (Bird)myList.get(i);
                bird.fly();
            }
        }*/

        //使用泛型机制
        //使用泛型机制List<Animal>之后，表示List集合中只允许存在Animal类型的数据。
       //用泛型来指定集合中存的数据的类型。
        List<Animal> myList = new ArrayList<Animal>();

        //指定Animal存储了字符串就错了。
        //myList.add("abc");

        Cat c = new Cat();
        Bird b = new Bird();
        myList.add(c);
        myList.add(b);

        //获取迭代器
        //表示迭代器迭代的是Animal类型。
        Iterator<Animal> it = myList.iterator();
        while(it.hasNext()){
            //使用泛型之后每一次迭代之后返回的数据都是Animal,不需要强制类型转换。
            Animal a = it.next();
            a.move();
            if(a instanceof Cat){
                Cat cat = (Cat)a;
                ((Cat) a).catchMouse();
            }
            if(a instanceof Bird){
                Bird bird = (Bird)a;
                bird.fly();
            }
        }

    }
}

class Animal{

    public void move(){
        System.out.println("动物在移动！");
    }
}
class Cat extends Animal{
    public void catchMouse(){
        System.out.println("猫抓老鼠!");
    }
}
class Bird extends Animal{
    public void fly(){
        System.out.println("鸟儿在飞翔!");
    }

}